#include <unistd.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>
#include <sys/shm.h>   
//#include <sys/ipc.h>
//#include <sys/types.h>
#include "shmdata.h"  
      
int main()  
{  
    int running = 1;        //程序是否继续运行的标志  
    void *shm = NULL;       //分配的共享内存的原始首地址  
    struct shared_use_st *shared;   //指向shm  
    int shmid;              //共享内存标识符  
    
    /*----创建共享内存---------------------------------*/ 
    shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);   

    if(shmid == -1)           //创建失败返回-1
    {  
        fprintf(stderr, "shmget failed\n");    //标准错误流，对应输出到终端
        exit(EXIT_FAILURE);  
    }  
   
    /*----将共享内存连接到当前进程的地址空间------------*/
    shm = shmat(shmid, 0, 0);  

    if(shm == (void*)-1)      //连接失败返回的是-1；其中((void*)-1)表示把-1转换成指针类型
    {  
        fprintf(stderr, "shmat failed\n");  
        exit(EXIT_FAILURE);  
    }  
    printf("\nShared-Memory attached at %ld\n", (long int)shm);  
        
    /*----设置共享内存---------------------------------*/  
    shared = (struct shared_use_st*)shm;  
    shared->written = 0;  
    
    while(running)       //读取共享内存中的数据  
    {  
        //没有进程向共享内存定数据有数据可读取  
        if(shared->written != 0)  
        {      
            printf("You wrote: %s", shared->text);  
            sleep(rand() % 3);      //在0,1,2中取随机数挂起指定秒数
           
            //读完数据，设置written使共享内存段可写  
            shared->written = 0;  
           
            //输入zend，退出循环（程序）  
            if(strncmp(shared->text, "end", 3) == 0)  
                running = 0;  
        }  
        else//有其他进程在写数据，不能读取数据  
            sleep(1);  
    }  
    
    /*----把共享内存从当前进程中分离------------------*/       
    if(shmdt(shm) == -1)  
    {  
        fprintf(stderr, "shmdt failed\n");  
        exit(EXIT_FAILURE);  
    }  
    //删除共享内存  
    if(shmctl(shmid, IPC_RMID, 0) == -1)  
    {  
        fprintf(stderr, "shmctl(IPC_RMID) failed\n");  
        exit(EXIT_FAILURE);  
    }  
    exit(EXIT_SUCCESS);  
}  
